package com.example.callcenter.util;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import io.jsonwebtoken.security.Keys;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import javax.crypto.SecretKey;
import java.nio.charset.StandardCharsets;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

@Component
public class JwtUtils {

    @Value("${jwt.secret}")
    private String secret;

    @Value("${jwt.access-token-expire}")
    private long accessTokenExpire;  // 从配置读取accessToken过期时间（毫秒）

    @Value("${jwt.refresh-token-expire}")
    private long refreshTokenExpire;  // 从配置读取refreshToken过期时间（毫秒）

    // 生成签名密钥
    private SecretKey getSigningKey() {
        return Keys.hmacShaKeyFor(secret.getBytes(StandardCharsets.UTF_8));
    }

    // 生成访问令牌（accessToken）
    public String generateAccessToken(Long userId, String username, String role) {
        Map<String, Object> claims = new HashMap<>();
        claims.put("username", username);
        claims.put("role", role);
        return generateToken(userId.toString(), claims, accessTokenExpire);  // 使用access过期时间
    }

    // 生成刷新令牌（refreshToken）
    public String generateRefreshToken(Long userId) {
        Map<String, Object> claims = new HashMap<>();
        claims.put("type", "refresh");
        // 关键修改：使用配置的refreshTokenExpire，而非accessTokenExpire*24
        return generateToken(userId.toString(), claims, refreshTokenExpire);
    }

    // 通用生成Token方法
    private String generateToken(String subject, Map<String, Object> claims, long expire) {
        return Jwts.builder()
                .setClaims(claims)
                .setSubject(subject)
                .setIssuedAt(new Date())
                .setExpiration(new Date(System.currentTimeMillis() + expire))  // 过期时间=当前时间+配置的expire
                .signWith(getSigningKey(), SignatureAlgorithm.HS256)
                .compact();
    }

    // 解析Token获取声明
    public Claims parseToken(String token) {
        return Jwts.parserBuilder()
                .setSigningKey(getSigningKey())
                .build()
                .parseClaimsJws(token)
                .getBody();
    }

    // 从Token中获取用户ID
    public Long getUserId(String token) {
        return Long.valueOf(parseToken(token).getSubject());
    }

    // 判断Token是否过期
    public boolean isTokenExpired(String token) {
        return parseToken(token).getExpiration().before(new Date());
    }

    // 新增：获取accessToken过期时间（分钟），提供给Service使用
    public long getAccessTokenExpireMinutes() {
        return accessTokenExpire / (1000 * 60);  // 毫秒转分钟
    }
}